
local function outputByte(gate, v)
	local p = 256
	for i = 1, 8 do
		p = p/2
		local port = 17 - i
		if v>=p then
			v = v - p
			Gate.setportstate(gate, port, 1)
		else
			Gate.setportstate(gate, port, 0)
		end
	end
end
local function inputByte(gate)
	local v = 0
	local p = 256
	for i = 1, 8 do
		p = p/2
		local port = 9 - i
		v = v + p*Gate.getportstate(gate, port)
	end
	return v
end

return function(gate)
	-- input
	if #gate.queueIn > 0 and gate.outputToggle then
	--if #gate.queueIn > 0 then
		local v = table.remove(gate.queueIn, #gate.queueIn)
		outputByte(gate, v)
		Gate.setportstate(gate, 18, 1)
		gate.outputToggle = false
		Gate.queue(gate, 1)
	else
		outputByte(gate, 0)
		Gate.setportstate(gate, 18, 0)
		gate.outputToggle = true
		if #gate.queueIn > 0 then
			Gate.queue(gate, 1)
		end
	end
	
	-- output
	if Gate.getportisrising(gate, 17) then
		local v = inputByte(gate)
		Gate.cbQueue(gate, string.format("%02X", v), 1024)
	end
end
